Generic request/response protocols.
## General Usage
[`RequestResponse`] is a `NetworkBehaviour` that implements a generic
request/response protocol or protocol family, whereby each request is
sent over a new substream on a connection. `RequestResponse` is generic
over the actual messages being sent, which are defined in terms of a
[`RequestResponseCodec`]. Creating a request/response protocol thus amounts
to providing an implementation of this trait which can then be
given to [`RequestResponse::new`]. Further configuration options are
available via the [`RequestResponseConfig`].
Requests are sent using [`RequestResponse::send_request`] and the
responses received as [`RequestResponseMessage::Response`] via
[`RequestResponseEvent::Message`].
Responses are sent using [`RequestResponse::send_response`] upon
receiving a [`RequestResponseMessage::Request`] via
[`RequestResponseEvent::Message`].
## Protocol Families
A single [`RequestResponse`] instance can be used with an entire
protocol family that share the same request and response types.
For that purpose, [`RequestResponseCodec::Protocol`] is typically
instantiated with a sum type.
## One-Way Protocols
The implementation supports one-way protocols that do not
have responses. In these cases the [`RequestResponseCodec::Response`] can
be defined as `()` and [`RequestResponseCodec::read_response`] as well as
[`RequestResponseCodec::write_response`] given the obvious implementations.
Note that `RequestResponseMessage::Response` will still be emitted,
immediately after the request has been sent, since `RequestResponseCodec::read_response`
will not actually read anything from the given I/O stream.
[`RequestResponse::send_response`] need not be called for one-way protocols,
i.e. the [`ResponseChannel`] may just be dropped.
## Limited Protocol Support
It is possible to only support inbound or outbound requests for
a particular protocol. This is achieved by instantiating `RequestResponse`
with protocols using [`ProtocolSupport::Inbound`] or
[`ProtocolSupport::Outbound`]. Any subset of protocols of a protocol
family can be configured in this way. Such protocols will not be
advertised during inbound respectively outbound protocol negotiation
on the substreams.